package com.cskaoyan.javase.oop1._16access._3why;

import java.util.Arrays;

/**
 * 为什么要使用访问权限修饰符?
 * 访问权限修饰符就像给门加锁一样,加上🔒后,外界就不能随意访问了,我们就实现的权限控制.
 * 但这只是表面用途,就像门锁可以撬开一样,访问权限的控制也是可以被打破的,Java自身就提供了打破访问权限的技术——反射
 * 那么这个时候，就像门锁是警告你这是我的私有地盘，你进来是违法的一样。访问权限也有类似的警告作用——
 *      我愿意让你访问的，推荐你访问的，就用public，或者放开访问权限
 *      不想让你访问的，警告你不要访问的，访问了也没用的，就用private，或者缩进访问权限。
 * 更具体的案例：
 *      1.工具类。其中的所有方法都是static修饰的，都是直接用类名点访问的。那么还需不需要创建对象？
 *          不需要，工具类的对象没有任何意义——于是就不要让工具类可以在外界创建对象
 *          所以工具类的构造器应该私有化。
 *          比如Math、Arrays、Collections等。
 *      2.方法实现时的中间方法，过程方法。这种方法是没有必要给外界使用和查看的，就私有化它们。
 *          public是告诉外界，可以使用该方法实现功能
 *          private是不需要给外界使用，外界也不需要关注和查看。
 *          对于开发者来说，这种操作叫做对外界隐藏实现细节，那么这些实现的细节开发者可以任意修改而不会对外界产生影响。
 *          所以在开发中，访问权限应该尽量少的提供，越严格越好。这样就大家都有好处。
 *
 * @since 14:51
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 'Arrays()' has private access in 'java.utildemo.Arrays'
        // Arrays a = new Arrays();
        test();
        // new A();
    }

    public static void test() {
        test2();
    }

    // Access can be private
    private static void test2() {
    }

}

class A {
    private A(){}
}

class AInstanceFactory {
    /*public static A getAInstance(){
        // 用反射破解私有权限，然后创建A对象
        // return A对象;
    }*/
}